ERC1400(1411) Security Token Standard
はじめに
この規格はPolymathが主導する団体、Security Token Standardによって提供されています
まとめ
Security Token Standardは従来ERC1400だけでしたが、機能が増えたためERC1400はその統合版として定められています
各規格の機能:
各トークンの譲渡制限や認証を定めた規格
各セキュリティトークンを複数種類設定する規格
発行時期の違いによる譲渡制限の対処
トランシェ機能の装備(=複数種類の証券を発行可能にする)
証券発行に関する書類の管理を行う規格
投資家情報の変更、証券情報のアップデートを反映
管理者や法要請による強制執行を実現する規格
tomato.icon<プロダクトの要件定義を決めたうえでスタンダードを見直す必要がある
スタンダードはUSの人たちが向こうの要件を基に且つ結構緩い感じ(ノリ)でスタンダード設定したから
ERC1400(1411)
セキュリティトークン規格に求められる条件
トークンの移転が成功したかどうかを確かめる関数
制限に引っかかった場合はその理由を返答することが求められる
強制執行機能を備えた関数
法的要請or refund発生時の対処
発行、償還時に発生する統一イベント
トークン保有者に紐づいた制限を追加で与えられる関数
譲渡制限や、特別権利等
上記の条件/制限を更新する関数
書類情報の更新とコントラクト上の情報とのリンク
準拠国の制限を設けない設計
ERC20に準拠していること
⇒これらを実現するために各規格が定められ、統合版としてERC1400が完成した
他の規格と統合する際に追加で必要になる関数
function operatorTransferByPartition: 各トランシェごとの強制実行を実現
function operatorRedeemByPartition: 各トランシェごとの強制償還を実現
Tomato.icon<なんでこれはERC1410で定められていなんだぽよ?
インターフェース
code:ERC1400(javascript)
/// @title IERC1400 Security Token Standard
interface IERC1400 is IERC20 {
// Document Management
// 証券ーPSトークン
function getDocument(bytes32 _name) external view returns (string, bytes32);
function setDocument(bytes32 _name, string _uri, bytes32 _documentHash) external;
// Token Information
// 証券ーPSトークン
function balanceOfByPartition(bytes32 _partition, address _tokenHolder) external view returns (uint256);
function partitionsOf(address _tokenHolder) external view returns (bytes32[]);
// Transfers
// 証券ーPSトークン
function transferWithData(address _to, uint256 _value, bytes _data) external;
function transferFromWithData(address _from, address _to, uint256 _value, bytes _data) external;
// Partition Token Transfers
// 証券ーPSトークン
function transferByPartition(bytes32 _partition, address _to, uint256 _value, bytes _data) external returns (bytes32);
function operatorTransferByPartition(bytes32 _partition, address _from, address _to, uint256 _value, bytes _data, bytes _operatorData) external returns (bytes32);
// Controller Operation
// 証券ーPSトークン
function isControllable() external view returns (bool);
function controllerTransfer(address _from, address _to, uint256 _value, bytes _data, bytes _operatorData) external;
function controllerRedeem(address _tokenHolder, uint256 _value, bytes _data, bytes _operatorData) external;
// Operator Management
// 管理者ー管理者情報管理
function authorizeOperator(address _operator) external;
function revokeOperator(address _operator) external;
function authorizeOperatorByPartition(bytes32 _partition, address _operator) external;
function revokeOperatorByPartition(bytes32 _partition, address _operator) external;
// Operator Information
// 管理者ー管理者情報管理
function isOperator(address _operator, address _tokenHolder) external view returns (bool);
function isOperatorForPartition(bytes32 _partition, address _operator, address _tokenHolder) external view returns (bool);
// Token Issuance
// 証券ーPSトークン
function isIssuable() external view returns (bool);
function issue(address _tokenHolder, uint256 _value, bytes _data) external;
function issueByPartition(bytes32 _partition, address _tokenHolder, uint256 _value, bytes _data) external;
// Token Redemption
// 証券ーPSトークン
function redeem(uint256 _value, bytes _data) external;
function redeemFrom(address _tokenHolder, uint256 _value, bytes _data) external;
function redeemByPartition(bytes32 _partition, uint256 _value, bytes _data) external;
function operatorRedeemByPartition(bytes32 _partition, address _tokenHolder, uint256 _value, bytes _operatorData) external;
// Transfer Validity
// 証券ーPSトークン
function canTransfer(address _to, uint256 _value, bytes _data) external view returns (byte, bytes32);
function canTransferFrom(address _from, address _to, uint256 _value, bytes _data) external view returns (byte, bytes32);
function canTransferByPartition(address _from, address _to, bytes32 _partition, uint256 _value, bytes _data) external view returns (byte, bytes32, bytes32);
// Controller Events
event ControllerTransfer(
address _controller,
address indexed _from,
address indexed _to,
uint256 _value,
bytes _data,
bytes _operatorData
);
event ControllerRedemption(
address _controller,
address indexed _tokenHolder,
uint256 _value,
bytes _data,
bytes _operatorData
);
// Document Events
event Document(bytes32 indexed _name, string _uri, bytes32 _documentHash);
// Transfer Events
event TransferByPartition(
bytes32 indexed _fromPartition,
address _operator,
address indexed _from,
address indexed _to,
uint256 _value,
bytes _data,
bytes _operatorData
);
event ChangedPartition(
bytes32 indexed _fromPartition,
bytes32 indexed _toPartition,
uint256 _value
);
// Operator Events
event AuthorizedOperator(address indexed _operator, address indexed _tokenHolder);
event RevokedOperator(address indexed _operator, address indexed _tokenHolder);
event AuthorizedOperatorByPartition(bytes32 indexed _partition, address indexed _operator, address indexed _tokenHolder);
event RevokedOperatorByPartition(bytes32 indexed _partition, address indexed _operator, address indexed _tokenHolder);
// Issuance / Redemption Events
event Issued(address indexed _operator, address indexed _to, uint256 _value, bytes _data);
event Redeemed(address indexed _operator, address indexed _from, uint256 _value, bytes _data);
event IssuedByPartition(bytes32 indexed _partition, address indexed _operator, address indexed _to, uint256 _value, bytes _data, bytes _operatorData);
event RedeemedByPartition(bytes32 indexed _partition, address indexed _operator, address indexed _from, uint256 _value, bytes _operatorData);
}
Source